package com.jdbc.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.jdbc.dao.AccountAnnotationDao;

@Service
public class AccountAnnotationServiceImpl implements AccountAnnotationService {
	
	@Autowired
	public AccountAnnotationDao aad;
	
	
	/*常用的三个传播行为的属性及其含义
	 * 
	 * REQUIRED：业务方法需要在一个事务中运行。如果方法运行时，
	 *			 已经处在一个事务中，那么加入到该事务，否则为自己创建一个新的事务。
	 * 
	 * NOT_SUPPORTED：声明方法不需要事务。如果方法没有关联到一个事务，
	 * 				容器不会为它开启事务。如果方法在一个事务中被调用，该事务会被挂起，
	 * 				在方法调用结束后，原先的事务便会恢复执行。
	 * 
	 * REQUIRESNEW：属性表明不管是否存在事务，业务方法总会为自己发起一个新的事务。
	 * 				如果方法已经运行在一个事务中，则原有事务会被挂起，
	 * 				新的事务会被创建，直到方法执行结束，新事务才算结束，
	 * 				原先的事务才会恢复执行。
	 * */
	@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.DEFAULT)
	@Override
	public void zhuanzhang(String accountOut, String accountIn, int money) {
		// TODO Auto-generated method stub
		aad.accountOut(accountOut, money);
		this.aa(accountIn, money);
	}
	@Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.DEFAULT)
	public void aa(String accountIn, int money) {
		System.out.println("NOT_SUPPORTED:被调用的方法中有事务");
//		int a = 1/0;
		aad.accountIn(accountIn, money);
	}

}
